package com.task.core.service;

import java.util.List;
import java.util.Map;

import com.task.common.domain.info.KeyAndValue;
import com.task.core.domain.MissionInfo;
import com.task.core.domain.info.SourceConfig;
import com.task.core.dto.request.MissionRequestDTO;
import com.task.core.dto.response.MissionPageResultResponseDTO;

/**
 * @author 迪迦.
 * @date 2024/11/4 17:28
 */
public interface MissionService {

  /**
   * 分页查询任务记录
   * @param request 请求参数
   * @return  分页记录
   */
  MissionPageResultResponseDTO getMissionByPage(MissionRequestDTO request);

  MissionInfo getMissionByCode(String code, boolean detail) ;

  List<KeyAndValue> getMissionForOption(MissionRequestDTO request);

  void addMission(MissionRequestDTO request);

  void modifyMission(MissionRequestDTO request);

  /**
   * 获取任务是否可用
   *
   * @param code        任务code
   * @param missionInfo 任务详情
   * @return true/false
   */
  Boolean getMissionStatus(String code, MissionInfo missionInfo);

  /**
   * 修改任务状态
   *
   * @param code   任务code
   * @param status 任务状态
   */
  void initMissionNormalState(String code, boolean status);

  /**
   * 修改任务连续失败累加或清零
   *
   * @param code   任务code
   * @param status 执行状态
   */
  void setMissionFailedCount(String code, boolean status);

  /**
   * 获取按任务名称或id验证重复结果
   *
   * @param dataCode    数据Code
   * @param missionInfo 任务详情
   */
  boolean getDataCanSend(String dataCode, MissionInfo missionInfo, SourceConfig sourceConfig,
      List<String> indexTableNameList, Map<String, Object> sendDataMap);

  void deleteMission(String missionCode, Long userId);

  void incrementFailedCount(String code);

  List<String> getMissionForHistory();

  /**
   * 获取任务
   *
   * @param deviceGroupCode 设备分组code
   * @param deptCode        部门code
   * @param normalState     异常状态
   * @return 任务
   */
  List<MissionInfo> getMissionListByGroupCodes(String deviceGroupCode, String deptCode,
      boolean normalState);

  /**
   * 修改任务状态
   * @param missionCode 任务code
   * @param status  修改的状态
   */
  void changeMissionStatus(String missionCode, boolean status);

  /**
   * 获取任务失败次数
   * @param missionCode
   * @return
   */
  Long getFailedCountByMissionCode(String missionCode);

  //数据源导入数据,需要更新跟他关联的所有任务的可用总数
  void updateMissionAndSourceAllCountBySourceCode(Integer intValue, String dataSourceCode, String sourceType);

  /**
   * 任务关联的数据源中数据使用状态+1
   * @param missionCode 任务code
   * @param sourceCode  数据源code
   */
  void incrementMissionAndSourceUseCountBySourceCode(String missionCode, String sourceCode);

  /**
   * 任务关联的数据源中数据使用状态-1
   * @param missionCode 任务code
   * @param sourceCode  数据源code
   */
  void decrementMissionAndSourceUseCountBySourceCode(String missionCode, String sourceCode);

    void updtateMissionStatusByMissionCode(Integer status, String code);

  MissionInfo getMissionDetailByCode(String missionCode, boolean detail);

    void updateMissionUseDataCountRelation(String datasourceCode);

  /**
   * 重置任务状态
   * @param missionCode
   */
  void initMission(String missionCode);
}
